/**
 * @Copyright:Copyright (c) 1992 - 2015
 * @Company: TengTong
 */
package com.tengtong.duang.commons.collections;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;

/**
 * Collection 容器类的一个包装器
 *
 * @author jai
 * @since: v1.0
 */
public class CollectionWrapper<T> {

	private final Collection<T> collections;
	
	public CollectionWrapper(Collection<T> c){
		this.collections = c;
	}
	
	/**
	 * 静态创建类
	 *
	 * @param c
	 * @return
	 */
	public static <T> CollectionWrapper<T> wrapper(Collection<T> c){
		return new CollectionWrapper<T>(c);
	}
	
	/**
	 * 非 null 且非空
	 *
	 * @return
	 */
	public boolean notNullOrEmpty(){
		return (collections != null && !collections.isEmpty());
	}
	
	/**
	 * 逐个处理
	 *
	 * @param action
	 */
	public void forEach(Consumer<? super T> action){
		if(notNullOrEmpty()){
			collections.stream().forEach(action);
		}
	}
	
	/**
	 * 提供中止的逐个迭代。
	 * 
	 * 如果 action 返回 false，则会中止迭代，返回 true 表示迭代继续
	 *
	 * @param action
	 */
	public void forEachHaveBreak(Function<? super T, Boolean> action){
		if(notNullOrEmpty()){
			for(T t: collections){
				if(!action.apply(t)){
					break;
				}
			}
		}
	}
	
	/**
	 * 提供一个过滤器
	 * 
	 * @param predicate
	 * @return
	 */
	public Stream<T> filter(Predicate<? super T> predicate){
		return collections.stream().filter(predicate);
	}
	
	/**
	 * 提供一个 map 方法
	 * @param mapper
	 * @return
	 */
	public <R> Stream<R> map(Function<? super T,? extends R> mapper){
		return collections.stream().map(mapper);
	}
	
	/**
	 * 提供一个  flatMap 方法
	 * @param mapper
	 * @return
	 */
	public <R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper){
		return collections.stream().flatMap(mapper);
	}
	
	/**
	 * 合并成一个字符串
	 * @return
	 */
	public String deepToString(){
		return deepToString("");
	}
	
	/**
	 * 使用分隔符 delimiter 合并成一个字符串
	 * @return
	 */
	public String deepToString(String delimiter){
		StringBuilder sb = new StringBuilder();
		forEach(x->{
			if(sb.length() > 0){
				sb.append(delimiter);
			}
			sb.append(x);
		});
		
		return sb.toString();
	}
	
	/**
	 * 转成 数组
	 * 
	 * @return
	 */
	public T[] toArray(Class<T> clazz){
		return collections.toArray(ArrayUtils.newSimpleArray(clazz, collections.size()));
	}
	
}
